<?php

namespace App\Http\Controllers\Car;

use App\Http\Controllers\Controller;
use App\Jobs\SendStartRentCar;
use App\Models\CarModels\CarRent;
use Illuminate\Database\QueryException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Validator;

/**
 * @group 运营管理->车辆基础信息管理->车辆调拨
 *
 * 采用 restful api
 *
 * Body Parameters 表示请求的所需要的参数
 *
 * Query Parameters 表示返回参数的名称
 */
class CarRentController extends Controller
{
    /**
     * 查看调拨信息
     *
     * @queryParam department_id  申请部门
     * @queryParam status 申请调拨还是借用 1. 调拨 2. 借用
     * @queryParam car_user 申请人
     * @queryParam start_time 出借时间
     * @queryParam end_time 结束时间
     * @queryParam car_id int 申请车辆
     * @queryParam apply_status 申请状态 1. 未通过 2.已通过 3.已执行
     */
    public function index(Request $request){
        return response()->json(encodeMsg(pageQuery(new CarRent(),$request),200),200);
    }

    /**
    * 车辆借出,调拨申请信息的添加 请注意 借出状态的修改为车辆的状态是正在运行中变为借出  调拨是车辆在停运 申请一段时间的调拨
    * @bodyParam department_id int required 申请部门
    * @bodyParam status int required 申请调拨还是借用 1. 调拨 2. 借用
    * @bodyParam car_user int required 申请人
    * @bodyParam start_time datetime required 出借时间
    * @bodyParam end_time datetime required 结束时间
    * @bodyParam car_id int required 申请车辆
    * @bodyParam kind int required 申请类型 1. 调拨 2.借用 选择调拨或者借用后传递过来
    * @queryParam department_id  申请部门
    * @queryParam status 申请调拨还是借用 1. 调拨 2. 借用
    * @queryParam car_user 申请人
    * @queryParam start_time 出借时间
    * @queryParam end_time 结束时间
    * @queryParam car_id int 申请车辆
    * @queryParam apply_status 申请状态 1. 审批中 2.已通过 3.未通过 4.通过但是被撤销 5.已执行成功 6. 未执行成功 联系程序员
    */
    public function store(Request $request){
        try{
            $validator = Validator::make($request->all(),genValidate());
            if($validator->fails()){
                return response()->json(encodeMsg($validator->errors()->messages(),400),400);
            }
            $data =  CarRent::create($request->all());
            return response()->json(encodeMsg($data,201),201);
        }catch (QueryException $e){
            return response()->json(encodeMsg(["message"=>"系统错误".$e->getMessage()],500),500);
        }
    }

    /**
     * 调拨信息显示(单个信息显示)
     *
     * @queryParam department_id  申请部门
     * @queryParam status 申请调拨还是借用 1. 调拨 2. 借用
     * @queryParam car_user 申请人
     * @queryParam start_time 出借时间
     * @queryParam end_time 结束时间
     * @queryParam car_id int 申请车辆
     * @queryParam apply_status 申请状态 1. 审批中 2.已通过 3.未通过 4.通过但是被撤销 5.已执行成功 6. 未执行成功 联系程序员
     * @queryParam kind 申请类型 1. 调拨 2.借用
     *
     *
     */
    public function show($pk){
        $data = CarRent::find($pk);
        if($data == []){
            return response()->json(encodeMsg(["message"=>"没有该申请信息"],404),404);
        }else{
            return response()->json(encodeMsg($data,200),200);
        }
    }

    /**
     * 调拨信息信息修改 这里最重要的是审批通过 通过 apply_status来通过审批 没有删除接口 只有撤销审批 通过的申请才能被撤销 并且如果任务通过了开始在执行过程中是不能撤销的
     *
     * @bodyParam apply_status int required 申请状态 1. 审批中 2.已通过 3.未通过 4.通过但是被撤销 5.已执行成功 6. 未执行成功 联系程序员
     * @bodyParam car_ids string required 批量操作接口
     * @queryParam department_id  申请部门
     * @queryParam status 申请调拨还是借用 1. 调拨 2. 借用
     * @queryParam car_user 申请人
     * @queryParam start_time 出借时间
     * @queryParam end_time 结束时间
     * @queryParam car_id int 申请车辆
     * @queryParam apply_status 申请状态 1. 审批中 2.已通过 3.未通过 4.通过但是被撤销 5.已执行成功 6. 未执行成功 联系程序员
     */
    public function updateV2(Request $request, $pk){
        $validator = Validator::make($request->all(),genValidate());
        if($validator->fails()){
            return response()->json(encodeMsg($validator->errors()->messages(),400),400);
        }
        $car_ids = $request->get('car_ids');
        $car_arr = explode(',',$car_ids);
        $carRent = CarRent::find($pk);
        if($carRent == []){
            return response()->json(encodeMsg(["message"=>"没有该申请信息"],404),404);
        }
        try {
            $applyStatus = $request->get('apply_status');
            $sTime = $carRent->start_time;
            $eTime = $carRent->end_time;
            if(strtotime($eTime) <= strtotime($sTime)){
                return response()->json(encodeMsg(["message" => "开始时间不能大于等于结束时间"], 404), 404);
            }
            if($carRent->apply_status == 4){
                return response()->json(encodeMsg(["message" => "已经撤销任务不能修改"], 404), 404);
            }
            //管理员只能通过审批 不通过审批 撤销审批
            if(!($applyStatus == 2 or $applyStatus == 3 or $applyStatus == 4)) {
                return response()->json(encodeMsg(["message" => "无效状态更改"], 404), 404);
                //通过审批流程
            }elseif($applyStatus == 2) {
                //通过审批的前提是审批未通过
                if ($carRent->apply_status != 1) {
                    return response()->json(encodeMsg(["message" => "请保证状态是未通过"], 404), 404);
                }
                if (strtotime($sTime) <= strtotime(now())) {
                    return response()->json(encodeMsg(["message" => "开始时间不能小于当前时间"], 404), 404);
                }
                //如果在这个时间段里面已经有其他的审批通过了 那么不能侵占这个时间段的使用
                $rent = CarRent::where(function ($q) use ($sTime, $eTime) {
                    $q->orWhere('start_time', '>', $sTime)->where('end_time', '<', $eTime);
                    $q->orWhere('start_time', '<', $sTime)->where('end_time', '>', $sTime);
                    $q->orWhere('start_time', '<', $eTime)->where('end_time', '>', $eTime);
                })->where('apply_status', '=', '2')->where('car_id', '=', $carRent->car_id)->get();
                if ($rent->toArray() != []) {
                    return response()->json(encodeMsg(["message" => "该时间段车辆已经被申请使用了"], 404), 404);
                }
                //通过id号 开始时间 去修改车辆表的状态信息 延时由这边计算
                SendStartRentCar::dispatch($carRent->id,$carRent->car_id, $carRent->status)->delay(strtotime($sTime) - strtotime(now()))->onConnection('redis');
                //到结束时间后停运
                SendStartRentCar::dispatch($carRent->id,$carRent->car_id, 4)->delay(strtotime($eTime) - strtotime(now()))->onConnection('redis');
            }elseif($applyStatus == 4){
                //撤销任务 当任务没有执行的时候才能撤销
                if(!$carRent ==2){
                    return response()->json(encodeMsg(["message" => "只有通过状态才能撤销"], 404), 404);
                }
                if((strtotime(now()) < strtotime($carRent->end_time)) and (strtotime(now()) > strtotime($carRent->start_time))){
                    return response()->json(encodeMsg(["message" => "执行中的任务不能被撤销"], 404), 404);
                }
            }
            $carRent->apply_status = $request->get('apply_status');
            $carRent->save();
            return response()->json(encodeMsg($carRent,200), 200);
        }catch (QueryException $e){
            return response()->json(encodeMsg(["message"=>"服务器错误".$e->getMessage()],500),500);
        }
    }
    /**
     * 调拨信息信息修改 这里最重要的是审批通过 通过 apply_status来通过审批 没有删除接口 只有撤销审批 通过的申请才能被撤销 并且如果任务通过了开始在执行过程中是不能撤销的
     *
     * @bodyParam ids string optional 批量操作接口
     * @bodyParam department_id int optional 申请部门
     * @bodyParam status int optional 申请调拨还是借用 1. 调拨 2. 借用
     * @bodyParam car_user int optional 申请人
     * @bodyParam start_time datetime optional 出借时间
     * @bodyParam end_time datetime optional 结束时间
     * @bodyParam kind int optional 申请类型 1. 调拨 2.借用 选择调拨或者借用后传递过来
     * @queryParam department_id  申请部门
     * @queryParam status 申请调拨还是借用 1. 调拨 2. 借用
     * @queryParam car_user 申请人
     * @queryParam start_time 出借时间
     * @queryParam end_time 结束时间
     * @queryParam car_id int 申请车辆
     * @queryParam apply_status 申请状态 1. 审批中 2.已通过 3.未通过 4.通过但是被撤销 5.已执行成功 6. 未执行成功 联系程序员
     */
    public function update(Request $request, $pk){
        $validator = Validator::make($request->all(),genValidate());
        if($validator->fails()){
            return response()->json(encodeMsg($validator->errors()->messages(),400),400);
        }
        $ids = $request->get('ids');
        $arr = explode(',',$ids);
        DB::beginTransaction();
        foreach ($arr as $pk) {
            $data = CarRent::find($pk);
            if ($data == []) {
                DB::rollBack();
                return response()->json(encodeMsg(["message" => "没有id为{$pk}记录"], 404), 404);
            }
            try {
                $data->update($request->all());

            } catch (QueryException $e) {
                DB::rollBack();
                return response()->json(encodeMsg(["message" => "数据{$pk}修改时出错".$e->getMessage()], 500), 400);
            }
        }
        DB::commit();
        return response()->json(encodeMsg(["message" => "修改成功"], 200), 200);
    }
}
